{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "import os\n",
    "\n",
    "def load_json(pth):\n",
    "    if not os.path.isfile(pth):\n",
    "        raise ValueError(\"error file addr\")\n",
    "    with open(pth,'r',encoding=\"utf-8\") as reader:\n",
    "        data = json.load(reader)\n",
    "        return data\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Some weights of the model checkpoint at F:\\PLM\\chinese_wwm_pytorch were not used when initializing BertModel: ['cls.predictions.transform.dense.weight', 'cls.seq_relationship.bias', 'cls.predictions.bias', 'cls.predictions.transform.dense.bias', 'cls.predictions.transform.LayerNorm.weight', 'cls.seq_relationship.weight', 'cls.predictions.decoder.weight', 'cls.predictions.transform.LayerNorm.bias']\n",
      "- This IS expected if you are initializing BertModel from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n",
      "- This IS NOT expected if you are initializing BertModel from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n"
     ]
    }
   ],
   "source": [
    "from collections import defaultdict\n",
    "from transformers import BertTokenizer, BertModel\n",
    "import torch\n",
    "import os\n",
    "import numpy as np\n",
    "\n",
    "# https://www.cnblogs.com/think90/p/13091705.html\n",
    "\n",
    "# F:/PLM/chinese_roberta_wwm_ext_pytorch\n",
    "# F:/PLM/chinese_wwm_pytorch\n",
    "# hfl/chinese-roberta-wwm-ext\n",
    "plm_dir = \"F:\\PLM\\chinese_wwm_pytorch\"\n",
    "\n",
    "device = torch.device(\"cpu\")\n",
    "tokenizer = BertTokenizer.from_pretrained(plm_dir)\n",
    "model = BertModel.from_pretrained(plm_dir,\n",
    "                                  output_hidden_states=True,\n",
    "                                  output_attentions=True).to(device)\n",
    "\n",
    "\n",
    "def embedding(word):\n",
    "    event_emb = torch.tensor([tokenizer.encode(word)]).to(device)[:, :64]\n",
    "    all_hidden_states, all_attentions = model(event_emb)[-2:]\n",
    "    rep = (all_hidden_states[-2][0] * all_attentions[-2][0].\n",
    "           mean(dim=0).mean(dim=0).view(-1, 1)).sum(dim=0)\n",
    "#     return rep.tolist()\n",
    "    return rep.detach().numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>query</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>s1</td>\n",
       "      <td>丰胸的方法有哪些</td>\n",
       "      <td>治疗方案</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>s2</td>\n",
       "      <td>还差一点就进子宫了</td>\n",
       "      <td>其他</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>s3</td>\n",
       "      <td>散光能好吗</td>\n",
       "      <td>疾病表述</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>s4</td>\n",
       "      <td>我的脂肪瘤是否存在恶变的倾向？</td>\n",
       "      <td>疾病表述</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>s5</td>\n",
       "      <td>白癜风不断恶化的原因</td>\n",
       "      <td>病因分析</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6926</th>\n",
       "      <td>s6927</td>\n",
       "      <td>怀孕能吃蛙小侠吗</td>\n",
       "      <td>其他</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6927</th>\n",
       "      <td>s6928</td>\n",
       "      <td>修补牙齿可以报医保</td>\n",
       "      <td>其他</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6928</th>\n",
       "      <td>s6929</td>\n",
       "      <td>阴天视线模糊是散光吗</td>\n",
       "      <td>疾病表述</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6929</th>\n",
       "      <td>s6930</td>\n",
       "      <td>豆腐的功效与作用</td>\n",
       "      <td>功效作用</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6930</th>\n",
       "      <td>s6931</td>\n",
       "      <td>白细胞2.8严重吗</td>\n",
       "      <td>指标解读</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>6931 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         id            query label\n",
       "0        s1         丰胸的方法有哪些  治疗方案\n",
       "1        s2        还差一点就进子宫了    其他\n",
       "2        s3            散光能好吗  疾病表述\n",
       "3        s4  我的脂肪瘤是否存在恶变的倾向？  疾病表述\n",
       "4        s5       白癜风不断恶化的原因  病因分析\n",
       "...     ...              ...   ...\n",
       "6926  s6927         怀孕能吃蛙小侠吗    其他\n",
       "6927  s6928        修补牙齿可以报医保    其他\n",
       "6928  s6929       阴天视线模糊是散光吗  疾病表述\n",
       "6929  s6930         豆腐的功效与作用  功效作用\n",
       "6930  s6931        白细胞2.8严重吗  指标解读\n",
       "\n",
       "[6931 rows x 3 columns]"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "pth = \"./KUAKE-QIC_train.json\"\n",
    "\n",
    "data = load_json(pth=pth)\n",
    "df = pd.DataFrame(data)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.to_csv(\"train.csv\",columns=['id','label','query'],index=False,encoding='utf-8') "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['其他', '功效作用', '医疗费用', '后果表述', '就医建议', '指标解读', '治疗方案', '注意事项',\n",
       "       '疾病表述', '病因分析', '病情诊断'], dtype=object)"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import LabelEncoder,OneHotEncoder\n",
    "import numpy as np\n",
    "\n",
    "encoder = LabelEncoder()\n",
    "label_index = encoder.fit_transform(df['label'].values)\n",
    "encoder.classes_\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [],
   "source": [
    "one_hot_encoder = OneHotEncoder()\n",
    "label_one_hot =  one_hot_encoder.fit_transform(np.array([label_index]).T)\n",
    "type(label_one_hot)\n",
    "label_one_hot = label_one_hot.toarray()\n",
    "\n",
    "# scipy.sparse.csr.csr_matrix\n",
    "# 稀疏矩阵存储"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# df = pd.concat([df,pd.DataFrame(label_one_hot)],axis=1)\n",
    "# df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7595907928388747"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.pipeline import make_pipeline\n",
    "\n",
    "train = df\n",
    "X = list(train['query'].map(embedding))\n",
    "y = label_index\n",
    "\n",
    "clf = make_pipeline(StandardScaler(), SVC(gamma='auto'))\n",
    "clf.fit(X, y)\n",
    "\n",
    "test = pd.DataFrame(load_json(\"./KUAKE-QIC_dev.json\"))\n",
    "test_X = list(test['query'].map(embedding))\n",
    "test_y = encoder.transform(test['label'])\n",
    "clf.score(test_X,test_y)\n",
    "\n",
    "# 15m 55.2s 运行时间\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['治疗方案', '疾病表述', '治疗方案', '病情诊断', '其他'], dtype=object)"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = ['孕妇长湿疹怎么办','阴天视线模糊是散光吗','退行性骨性膝关节病治疗打玻璃酸钠好吗',\n",
    "\"嗓子疼，吞口水也很疼，早上吐的痰是粉色的带血丝是什么原因啊？\",\"新生儿筛查结果的日期格式怎么写？\"]\n",
    "emd = []\n",
    "for item in data:\n",
    "    emd.append(embedding(item))\n",
    "_y = clf.predict(emd)\n",
    "encoder.inverse_transform(_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle\n",
    "\n",
    "def save_model(pth):\n",
    "    with open(pth, 'wb') as f:\n",
    "        pickle.dump(clf, f)\n",
    "\n",
    "def load_model(pth):\n",
    "    with open(pth, 'rb') as f:\n",
    "        clf = pickle.load(f)\n",
    "        return clf\n",
    "\n",
    "# save_model(pth=\"model/svc.pickle\")\n",
    "# clf = load_model(pth=\"model/svc.pickle\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [],
   "source": [
    "test = pd.DataFrame(load_json(\"./KUAKE-QIC_dev.json\"))\n",
    "test_X = list(test['query'].map(embedding))\n",
    "test_y = encoder.transform(test['label'])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import ConfusionMatrixDisplay\n",
    "\n",
    "clf = load_model(pth=\"model/svc.pickle\")\n",
    "\n",
    "y_pred = clf.predict(test_X)\n",
    "cm = confusion_matrix(test_y, y_pred)\n",
    "cm_display = ConfusionMatrixDisplay(cm).plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['其他', '功效作用', '医疗费用', '后果表述', '就医建议', '指标解读', '治疗方案', '注意事项',\n",
       "       '疾病表述', '病因分析', '病情诊断'], dtype=object)"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "encoder.classes_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1955"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(y_pred)"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "523fa54491c9fe49381f47ad0ff9dc85e8f0d070e4dbb6d153365e32788ea703"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
